package com.ry.demo.register.server;

import lombok.Data;

/**
 * @Description: 服务实例
 *
 * 里面包含了一个服务实例的所有信息，还包括了 契约信息lease
 *
 */
@Data
public class ServiceInstance {

    /**
     * 服务名称
     */
    private String serviceName;

    /**
     * 服务实例ID
     */
    private String serviceInstanceId;

    /**
     * 服务所在机器的主机名
     */
    private String hostname;

    /**
     * 服务机器的ip地址
     */
    private String ip;

    /**
     * 服务监听端口
     */
    private Integer port;

    /**
     * 契约信息
     */
    private Lease lease;

    public ServiceInstance() {
        this.lease = new Lease();
    }

    /**
     * 服务续约
     */
    public void renew() {
        this.lease.renew();
    }

    /**
     * 服务实例是否存活
     * @return
     */
    public Boolean isAlive() {
        return this.lease.isAlive();
    }


    /**
     * @Description: 服务实例契约信息
     */
    public class Lease {

        /**
         * 最进一次心跳的时间
         */
        private Long latestHeartbeatTime = System.currentTimeMillis();

        /**
         * 判断一个服务实例不再存活的周期
         */
        private final Long NOT_ALIVE_PERIOD = 90 * 1000L;

        /**
         * 续约
         */
        public void renew(){
            latestHeartbeatTime = System.currentTimeMillis();
            System.out.println("服务实例【" + serviceInstanceId + "】，进行续约：" + latestHeartbeatTime);
        }

        /**
         * 服务实例是否还存活
         * @return
         */
        public Boolean isAlive(){

            if (System.currentTimeMillis() - latestHeartbeatTime > NOT_ALIVE_PERIOD){
                System.out.println("服务实例【" + serviceInstanceId + "】，不再存活");
                return false;
            }
            System.out.println("服务实例【" + serviceInstanceId + "】，保持存活");
            return true;
        }

    }
}
